﻿#define _CRT_SECURE_NO_WARNINGS 1

//写一个宏，可以将一个整数的二进制位的奇数位和偶数位交换。
#include <stdio.h>

#define SWAP(x) (x=(((x&0x55555555)<<1)+((x&0xaaaaaaaa)>>1)))

int main()
{
	int b = 012;
	printf("%d\n", b);

	int a = 10;
	SWAP(a);

	printf("%d\n", a);
	return 0;
}



//#define SwapIntBit(n) (((n) & 0x55555555) << 1 | ((n) & 0xaaaaaaaa) >> 1)
//交换奇偶位，需要先分别拿出奇偶位。
//既然是宏，分别拿出用循环不是很现实，那就用& 这些位的方式来做。
//奇数位拿出，那就是要& 上010101010101……，
//偶数位拿出，就是要& 上101010101010……，
//对应十六进制分别是555……和aaa……，一般我们默认是32位整数，4位对应一位16进制就是8个5，8个a。
//通过 & 0x55555555的方式拿出奇数位和 & 0xaaaaaaa的方式拿出偶数位。
//奇数位左移一位就到了偶数位上，偶数位右移一位就到了奇数位上，最后两个数字或起来，就完成了交换。
//
//※这个宏只能完成32位以内的整形，要想完成64位的，那就将5和a的数量翻倍即可。